package com.example.demo.service.imp;

import com.example.demo.controller.data.ReturnData;
import com.example.demo.controller.vo.RegisterUser;
import com.example.demo.dao.UserDao;
import com.example.demo.entity.User;
import com.example.demo.service.MyAsyncService;
import com.example.demo.service.UserService;
import com.example.demo.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

//  UserService实现类
@Service
public class UserServiceImp implements UserService {
    @Autowired
    UserDao userDao;
    @Resource
    RedisTemplate redisTemplate;

    @Resource
    MyAsyncService myAsyncService;

    @Override
    public ReturnData getUser(String token) {
        try {

            String username = TokenUtils.getUsernameByToken(token);//根据token拿用户名
            User user = userDao.findByUsername(username).get(0);//根据用户名查用户信息
            //设置成功的返回
            return ReturnData.ok("获取成功", user);
        } catch (NoSuchElementException e) {
            //设置失败的返回
            return ReturnData.error("没有这个用户");
        }
    }

    //登录的接口业务处理
    @Override
    public ReturnData login(String user, String pwd) {
        //调用数据库操作类，查找对应表里有没有数据匹配
        List<User> users = userDao.findByUsernameAndPassword(user, pwd);
        if (users.size() > 0) {//如果有，登陆成功
            HashMap<String, Object> map = new HashMap<>();
            map.put("token", TokenUtils.getToken(users.get(0).getUsername()));
            users.get(0).setPassword("");
            map.put("userInfo", users.get(0));
            redisTemplate.opsForValue().set(users.get(0).getUsername(), users.get(0));//写进缓存
//            redisTemplate.opsForValue().get(users.get(0).getUsername());//读缓存
            return ReturnData.ok("登陆成功", map);
        } else {//查找不到对应的用户数据
            return ReturnData.error("用户名密码错误");//返回空，此时要在前端提示登录失败
        }
    }

    /**
     * 获取验证码的接口
     *
     * @param email
     * @return
     */
    @Override
    public ReturnData getCode(String email) {
//        1.先生成一个随机验证码；
//        2.把这个验证码存起来，可以存到redis缓存，也可以存到数据库
//        3.把验证码发给对应的邮箱
//        4.返回发送成功的结果
//        5.返回给前端，告诉前端验证码已发送到手机或者邮箱，请注意查收

        //0到899999 new Random().nextInt(899999)
        int code = new Random().nextInt(899999) + 100000;//100000
        System.out.println(code);
        redisTemplate.opsForValue().set(email, code, 3, TimeUnit.MINUTES);//设置缓存时间为3分
//        Thread.sleep(2000);//延时2秒执行后面的代码，模拟发邮件给email耗时
        myAsyncService.sendSms(email, code);

        return ReturnData.ok("验证码已发送到手机或者邮箱，请注意查收", "");

    }

    /**
     * 注册实现
     *
     * @param user
     * @return
     */
    @Override
    public ReturnData register(RegisterUser user) {
        //        1.判断这3个参数对不对，有没有数据
//          2.判断验证码和缓存中的验证码是不是一致
//        3.判断数据库中有没有这个用户名
//        4.把用户名和密码插入用户表
//            5.返回注册成功
        if (user.getEmail() == null || user.getEmail().equals("")) {
            return ReturnData.error("请输入邮箱");
        }
        if (user.getPassword() == null || user.getPassword().equals("")) {
            return ReturnData.error("请输入密码");
        }
        if (user.getUsername() == null || user.getUsername().equals("")) {
            return ReturnData.error("请输入用户名");
        }
        if (user.getCode() == null || user.getCode().equals("")) {
            return ReturnData.error("请输入验证码");
        }
        //校验验证码
        int codeRedis = 0;
        try {
            codeRedis = (int) redisTemplate.opsForValue().get(user.getEmail());//从缓存中拿验证码
        } catch (NullPointerException exception) {
            return ReturnData.error("验证码已过期");
        }
        if (!user.getCode().equals(codeRedis + "")) {//判断前段传过来的验证码和缓存中的验证码是不是一致
            return ReturnData.error("验证码错误");
        }
        List<User> list = userDao.findByUsername(user.getUsername());
        if (list.size() > 0) {//如果查出来的结果长度大于0，表明存在这个用户名
            return ReturnData.error("该用户名已注册");
        }
        list = userDao.findByEmail(user.getEmail());
        if (list.size() > 0) {//如果查出来的结果长度大于0，表明存在这个邮箱的用户
            return ReturnData.error("该邮箱已注册");
        }
        User userObj = new User();
        userObj.setUsername(user.getUsername());
        userObj.setPassword(user.getPassword());
        userObj.setEmail(user.getEmail());
        //添加注册时间
        userObj.setRegister_date(new Timestamp(System.currentTimeMillis()));
        userDao.save(userObj);//保存
        return ReturnData.ok("注册成功，请前往登录", "");

    }

    @Override
    public ReturnData updateUserInfo(RegisterUser registerUser, String token) {
        String username = TokenUtils.getUsernameByToken(token);//根据token拿用户名
        User user = userDao.findByUsername(username).get(0);//根据用户名查用户信息
        if (!StringUtils.hasText(registerUser.getNickname())) {//如果没有数据
            return ReturnData.error("请输入昵称");
        }
        if (!StringUtils.hasText(registerUser.getPhone())) {//如果没有数据
            return ReturnData.error("请输入手机");
        }
        if (!StringUtils.hasText(registerUser.getSgin())) {//如果没有数据
            return ReturnData.error("请输入签名");
        }
        if (registerUser.getSex()==0) {//如果没有数据
            return ReturnData.error("请选择性别");
        }
        if (!StringUtils.hasText(registerUser.getAvatar())) {//如果没有数据
            return ReturnData.error("请上传头像");
        }
        //修改实体类的数据
        user.setNickname(registerUser.getNickname());
        user.setPhone(registerUser.getPhone());
        user.setSgin(registerUser.getSgin());
        user.setSex(registerUser.getSex());
        user.setAvatar(registerUser.getAvatar());
//        user.setRegister_date();
        userDao.save(user);//改完存回数据库
        return ReturnData.ok("修改成功");
    }
}
